//给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组，并返回该子数组的长度。
//
//
//
// 示例 1：
//
//
//输入: nums = [0,1]
//输出: 2
//说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。
//
// 示例 2：
//
//
//输入: nums = [0,1,0]
//输出: 2
//说明: [0, 1] (或 [1, 0]) 是具有相同数量 0 和 1 的最长连续子数组。
//
//
//
// 提示：
//
//
// 1 <= nums.length <= 10⁵
// nums[i] 不是 0 就是 1
//
//
//
//
//
// 注意：本题与主站 525 题相同： https://leetcode-cn.com/problems/contiguous-array/
//
// Related Topics 数组 哈希表 前缀和 👍 140 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function findMaxLength(nums: number[]): number {
    /**
     * @param {number[]} nums
     * @return {number}
     */
    const n = nums.length;
    const map = new Map();
    map.set(0, -1);
    //? 前缀和
    let pre = 0;
    let res = 0;
    for (let i = 0; i < n; i++) {
        pre += nums[i] == 0 ? -1 : 1;
        //? 如果存在的话(说明这一段总和为0)，则将当前索引和之前存入的索引值(第一次存入的,不再改变)相减  取题目要求的最大值
        if (map.has(pre)) {
            res = Math.max(res, i - map.get(pre));
        } else {
            //? 记录前缀和索引
            map.set(pre, i);
        }
    }
    return res;
};
//? -1 1 -1 1 -1 1

//leetcode submit region end(Prohibit modification and deletion)
